package com.example.study.jetpack.compose

import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable

/**
 *  created by 20300
 *   on 2022/3/14
 *   describe:https://blog.csdn.net/Mr_Tony/article/details/118910549?spm=1001.2014.3001.5502
 */
class Compose的Key {
    /*在Compose中状态的改变会促使调用点的组合发生重组,但是有时候重组会发生在我们并不想重组的地方.
    常见的比如列表,如果其中一个item数据发生改变导致整个列表重组那么会是很大的问题,因此这时候需要使用可以来解决.
    示例:*/
    @Composable
    fun MessageList(messages: List<String>) {
        LazyColumn {
            items(
                items = messages,
                key = { message ->
                    // Return a stable + unique key for the item
                    //message.id
                }
            ) { message ->
                //MessageRow(message)
            }
        }
    }

    /*key
    key是一种可组合的实用程序,用于"group"或"key"组合内的执行块.这有时需要控制流内部的正确性,这可能导致给定
    的可组合调用在组合期间执行多次.
    键的值不需要是全局唯一的,只需要在组合key中那个点的调用中是唯一的
    代码定义如下
     @Composable
    inline fun <T : Any?> key(keys: vararg Any?, block: () -> T): @Composable T
    示例:
    //简单结构的单一key
    import androidx.compose.runtime.key

for (user in users) {
    key(user.id) { UserPreview(user = user) }
}

for (user in users.filter { isAdmin }) {
    key(user.id) { Friend(friend = user) }
}
    //复杂对象的单一key
    import androidx.compose.runtime.key

for ((child, parent) in relationships) {
    key(parent.id to child.id) {//to 表示组成一个Pair<A,B>结构
        User(user = child)
        User(user = parent)
    }
}

    //组合key,如果对象有多个约束条件可以使用这种

    import androidx.compose.runtime.key
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember

for (element in elements) {
    val selected by key(element.id, parentId) { remember { mutableStateOf(false) } }
    ListItem(item = element, selected = selected)
}

*/


    /*key

    https://developer.android.google.cn/reference/kotlin/androidx/compose/runtime/package-summary#key(kotlin.Array,kotlin.Function0)

    to

    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/to.html
    */



}